/**
 * @description 登录验证中间件
 */
const _ = require('lodash')
const util = require('util') // NodeJS 自带的工具模块
const jwt = require('jsonwebtoken')
const { JWT_SECRET_KEY } = require('../conf/secretKeys')
const { ErrorModel } = require('../model/ResModel')
const { loginCheckFailInfo } = require('../model/ErrorInfo')

const verify = util.promisify(jwt.verify)

/**
 * 登录验证
 * @param {object} ctx ctx
 * @param {function} next next
 */
async function loginCheck(ctx, next) {
  // 取 Token
  const token = ctx.header.authorization
  if (_.isEmpty(token)) {
    ctx.body = new ErrorModel(loginCheckFailInfo)
    return
  }

  try {
    // 解析 Token - Bearer token 格式
    const payload = await verify(token.split(' ')[1], JWT_SECRET_KEY)
    // 使用 ctx.state.tokenPayload 在中间件中传递用户数据
    ctx.state.tokenPayload = payload
  } catch (ex) {
    ctx.body = new ErrorModel(loginCheckFailInfo)
    return
  }
  await next()
}

module.exports = loginCheck
